package classic150;

/**
 * <h3>leetcode</h3>
 *
 * @author BigFaceCat
 * @date 2023/11/7 11:49
 * @description <p>leetcode80-删除有序数组中的重复项Ⅱ-数组-中等题</p>
 */
public class No80 {
    public static void main(String[] args) {
        int[] nums = {0, 0, 1, 1, 1, 1, 2, 3, 3};
        int i = removeDuplicates(nums);
        System.out.println(i);

        for (int j = 0; j < i; j++) {
            System.out.print(nums[j] + " ");
        }
    }

    /**
     *  出现次数超过两次的元素只出现两次，那么 k = 2
     *  思路：
     * （1）两个指针，快指针fast、慢指针slow，开始时候令quick和slow初始化都为 k
     * （2）nums.length <= k的时候，说明nums数组的大小都没 k大、里面的数据都符合题目条件，直接return nums.length
     * （3）如果fast < nums.length：
     *     如果nums[fast] == nums[slow - k]那就说明当前元素与前面的 k个元素相同，不做交换，fast++
     *     如果nums[fast] ！= nums[slow - k]，说明nums[fast]与前 k个元素不同，进行交换，slow++、fast++
     *
     * @param nums
     * @return
     */
    public static int removeDuplicates(int[] nums) {
        //可以把k = 2抽取成一个方法，无论k为多少都可以使用
        int k = 2;
        int len = nums.length;
        if (len <= k){
            return len;
        }

        int fast = k;
        int slow = k;

        while (fast < len){
            if (nums[fast] != nums[slow - k]){
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
}